#ifndef READ_NFC_DATA_H
#define READ_NFC_DATA_H

#include <stdint.h>
#include <stdbool.h>
#include "esp_err.h"

#ifdef __cplusplus
extern "C" {
#endif

// NFC数据结构定义
typedef struct {
    uint32_t mount_point;       // 挂点编号 (4字节)
    uint16_t device_type;       // 设备类型 (2字节)
    uint16_t reserved1;         // 预留字段1 (2字节)
    uint32_t timestamp;         // 时间戳 (4字节)
    uint32_t reserved2;         // 预留字段2 (4字节)
} __attribute__((packed)) nfc_data_t;

// 卡片类型枚举
typedef enum {
    CARD_TYPE_UNKNOWN = 0,
    CARD_TYPE_MIFARE_CLASSIC,
    CARD_TYPE_NTAG213,
    CARD_TYPE_NTAG215,
    CARD_TYPE_NTAG216
} card_type_t;

// RC522寄存器地址定义
#define RC522_REG_VERSION           0x37
#define NFC_DATA_TIMEOUT_MS 5000  // NFC数据超时时间：3秒
/**
 * @brief 获取当前从NFC读取的挂点编号
 * @return 挂点编号
 */
uint32_t get_nfc_mount_point(void);


static void rc522_reset_state(void);

// ntag213
static void nfc_read_and_parse_data_universal(void);
static uint8_t rc522_select_tag_improved(uint8_t *serial_num, uint8_t *sak);
static card_type_t identify_card_type(uint8_t *atqa, uint8_t sak);
static uint8_t ntag_read_block_data(uint8_t start_page, uint8_t *block_data);
static uint8_t ntag_read_page(uint8_t page_addr, uint8_t *recv_data);


/**
 * @brief 检查NFC数据是否有效
 * @return true=数据有效, false=数据无效
 */
bool is_nfc_data_valid(void);

/**
 * @brief 写入NFC卡数据
 * @param mount_point 挂点编号
 * @param device_type 设备类型
 * @return ESP_OK=成功, 其他=失败
 */
esp_err_t nfc_write_data(uint32_t mount_point, uint16_t device_type);

/**
 * @brief NFC数据读取任务
 * @param pvParameters 任务参数
 */
void nfc_read_task(void *pvParameters);

/**
 * @brief RC522 I2C初始化
 * @return ESP_OK=成功, 其他=失败
 */
esp_err_t rc522_i2c_init(void);

/**
 * @brief 读取RC522寄存器
 * @param reg_addr 寄存器地址
 * @param data 读取数据缓冲区
 * @param len 读取长度
 * @return ESP_OK=成功, 其他=失败
 */
esp_err_t rc522_read_register(uint8_t reg_addr, uint8_t *data, size_t len);

/**
 * @brief 初始化RC522为RFID模式
 * @return ESP_OK=成功, 其他=失败
 */
esp_err_t rc522_init_rfid_mode(void);

#ifdef __cplusplus
}
#endif

#endif // READ_NFC_DATA_H